#ifndef DASHBOARDCLIENT_H
#define DASHBOARDCLIENT_H
#include "BaseClient.h"
#include "RTDEProtocol.h"
#include <condition_variable>
#include <mutex>
#include <atomic>

namespace CURCONTROL {

/*!
* \brief dashborad客户端：负责控制机械臂解锁、开关机
* \brief 开放的函数接口均可能睡眠
*/
class DashBoardClient : public BaseClient
{
private:
    std::condition_variable conVar_;// 条件变量
    std::mutex conMtx_;// 互斥元
    std::string dashboardMsg_;// dashboard端口回执的消息
    std::mutex msgMtx_;// 互斥元
    std::atomic_bool ready_;// 与条件变量一起配合使用的标志
    RobotMode robotmode_;
    SafetyMode safetymode_;
    std::mutex modeMtx_;// 互斥元
public:
    DashBoardClient();
    ~DashBoardClient() override;
    /*!
   * \brief 与机械臂建立链接
   *
   * \param[in] 机械臂ip
   * \param[out] 链接成功的回执消息
   *
   * \returns 链接成功返回true
   */
    bool Connect(const std::string& robotIp, std::string &rtnMsg);
    /*!
   * \brief 停止程序运行
   *
   * \returns 成功返回"Stopped"
   */
    std::string StopProgram();
    /*!
   * \brief 开始程序运行
   *
   * \returns 成功返回"Starting program"
   */
    std::string PlayProgram();
    /*!
   * \brief 暂停程序运行
   *
   * \returns 成功返回"Pausing program"
   */
    std::string PauseProgram();
    /*!
   * \brief 机械臂上电
   *
   * \returns 成功返回"Powering on"
   */
    std::string PowerOn();
    /*!
   * \brief 机械臂下电
   *
   * \returns 成功返回"Powering off"
   */
    std::string PowerOff();
    /*!
   * \brief 机械臂关机
   *
   * \returns 成功返回"Shutting down"
   */
    std::string Shutdown();
    /*!
   * \brief 机械臂解锁
   *
   * \returns 成功返回"Brake releasing"
   */
    std::string BrakeRelease();
    /*!
   * \brief 获取robot mode
   *
   * \returns "Robotmode: <mode>", where <mode> is
      NO_CONTROLLER
      DISCONNECTED
      CONFIRM_SAFETY
      BOOTING
      POWER_OFF
      POWER_ON
      IDLE
      BACKDRIVE
      RUNNING
   */
    std::string GetRobotModeStr();
    RobotMode GetRobotMode();
    std::string GetSafetyModeStr();
    SafetyMode GetSafetyMode();
    /*!
   * \brief 关闭UR的安全弹窗
   *
   * \returns 成功返回"closing popup"
   */
    std::string ClosePopup();
    /*!
   * \brief 关闭UR的安全弹窗
   *
   * \returns 成功返回"closing safety popup"
   */
    std::string CloseSafetyPopup();
    /*!
   * \brief 复位UR的安全停止模式
   *
   * \returns 成功返回"Protective stop releasing"
   */
    std::string UnlockProtectiveStop();
    /*!
   * \brief 安全重启
   *
   * \returns 成功返回"Restarting safety"
   */
    std::string RestartSafety();
private:
    /*!
   * \brief 复位自身状态
   */
    void Clear() override;
    /*!
   * \brief 解析端口的数据
   *
   * \param[in] 获取的待解析的通信数据
   */
    void ReceiveCallback(std::vector<uint8_t> &bytes);
    /*!
   * \brief 执行命令
   *
   * \returns 执行成功返回对应字符串
   */
    bool DoCommand(const std::string &cmd);

    void ParseStr(const std::string &str);

};

}// namespace CURCONTROL
#endif // DASHBOARDCLIENT_H
